#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/6/16 9:40
# @Author  : fuchen'en
# @Description:
import pika
import time

# RabbitMQ的用户名/密码
credentials = pika.PlainCredentials('test', 'test123')
# 连接参数
parameters = pika.ConnectionParameters(host='10.0.20.66',
                                       port='5672',
                                       virtual_host='/',
                                       credentials=credentials)
# 建立连接
connection = pika.BlockingConnection(parameters)
# 获取连接通道
channel = connection.channel()
# 声明一个队列。用于rpc通信。
channel.queue_declare(queue='rpc_queue')


# 定义一个计算斐波那契数列的函数
def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)


# 对于请求的回调函数
def on_request(ch, method, props, body):
    n = int(body)

    print(' [.] fib({!s})'.format(n))
    time.sleep(5)  # 延迟5秒，可以看到生成的临时队列，用于保存回调
    response = fib(n)

    # 服务器生成响应消息，此时可不用具名交换机，使用默认交换机
    ch.basic_publish(exchange='',
                     routing_key=props.reply_to,
                     properties=pika.BasicProperties(correlation_id=props.correlation_id),
                     body=str(response))
    # 服务器手动发送确认信息，预防RabbitMQ死机或者异常
    ch.basic_ack(delivery_tag=method.delivery_tag)


# 保证每个服务器消费者进程只能处理一个消息，均衡服务器处理能力
channel.basic_qos(prefetch_count=1)
# 服务器开始处理消息，处理结果通过回调函数返回
channel.basic_consume(queue='rpc_queue', on_message_callback=on_request)

print(' [x] Awaiting RPC request')
channel.start_consuming()
